
package cn.com.pusai.core.util;

import java.text.*;
import java.util.Calendar;
import java.util.Date;
/**
 * 日期操作类(日期转化,日期加减操作)
 * @author 
 * 
 * */
public class DateUtil
{
	/**
	 *日期格式 yyyy-MM-dd
	 * */
	public static final String DATE_PATTERN = "yyyy-MM-dd";
	
	/**
	 *日期格式 yyyy-MM-dd HH:mm:ss
	 * */
	public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
	
	/**
	 *日期格式 HH:mm:ss
	 * */
	public static final String TIME_PATTERN = "HH:mm:ss";

	public DateUtil()
	{
	}
	
	
	/**
	 * 格式化日期 
	 * @param millis Long 日期格式为长整形 如(1970-01-19  转化为长整形后 1551212464)
	 * @param pattern String  日期格式  今天变量三种格式
	 * @return 字符串格式日期
	 * */
	public static String format(long millis, String pattern)
	{
		return format(new Date(millis), pattern);
	}

	
	
	/**
	 * 格式化日期 
	 * @param date 日期对象
	 * @param pattern String  日期格式  今天变量三种格式
	 * @return 字符串格式日期
	 * */
	public static String format(Date date, String pattern)
	{
		DateFormat formatter = new SimpleDateFormat(pattern);
		return formatter.format(date);
	}
	
	/**
	 * 获得日期的 (yyyy-MM-dd)部分
	 * @param date Date 对象
	 * @return String 格式字符串
	 * */
	public static String formatDate(Date date)
	{
		return format(date, "yyyy-MM-dd");
	}
	
	/**
	 * 获得日期 (HH:mm:ss)格式部分
	 * @param date Date 对象
	 * @return String 格式字符串
	 * */
	public static String formatTime(Date date)
	{
		return format(date, "HH:mm:ss");
	}
	
	
	/**
	 * 获得日期 (yyyy-MM-dd HH:mm:ss)格式部分
	 * @param date Date 对象
	 * @return String 格式字符串
	 * */
	public static String formatDateTime(Date date)
	{
		return format(date, "yyyy-MM-dd HH:mm:ss");
	}
	
	
	/**
	 * 获得当前日期或时间
	 * @param pattern 日期格式
	 * @return String 
	 * */
	public static String formatCurrent(String pattern)
	{
		return format(new Date(), pattern);
	}
	
	/**
	 * 获得当前日期的 (yyyy-MM-dd)部分
	 * @param date Date 对象
	 * @return String 格式字符串
	 * */
	public static String formatCurrentDate()
	{
		return format(new Date(), "yyyy-MM-dd");
	}

	
	/**
	 * 获得当前日期的 (HH:mm:ss)部分
	 * @param date Date 对象
	 * @return String 格式字符串
	 * */
	public static String formatCurrentTime()
	{
		return format(new Date(), "HH:mm:ss");
	}

	
	/**
	 * 获得当前日期的 (yyyy-MM-dd HH:mm:ss)部分
	 * @param date Date 对象
	 * @return String 格式字符串
	 * */
	public static String formatCurrentDateTime()
	{
		return format(new Date(), "yyyy-MM-dd HH:mm:ss");
	}
	
	
	
	
	/**
	 * 转化为可比较的日期格式
	 * @param date 日期对象
	 * @return Date
	 * */
	public static Date getTheDate(Date date)
	{
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(11, 0);
		cal.set(12, 0);
		cal.set(13, 0);
		cal.set(14, 0);
		return cal.getTime();
	}
	
	
	
	/**
	 * 比较两个日期
	 * @param start 开始日期
	 * @param end 结束日期
	 * @return int 比较相差值( -1 start<end)  (0 start=end) (1 start>end)
	 * */
	public static int compareDate(Date start, Date end)
	{
		if (start == null && end == null)
			return 0;
		if (end == null)
			return 1;
		if (start == null)
			start = new Date();
		start = getTheDate(start);
		end = getTheDate(end);
		return start.compareTo(end);
	}
	
	
	/**
	 * 将字符串日期转化为Date对象
	 * @param dateString 源字符串
	 * @param pattern 要转化的格式
	 * @param Date 对象
	 * */
	public static Date parse(String dateString, String pattern) throws Exception{
		DateFormat formatter = new SimpleDateFormat(pattern);	
		return formatter.parse(dateString);	
	}
	
	
	/**
	 * 日期添加年
	 * @param date 源日期
	 * @param amount 添加年份的大小
	 * @return Date 对象
	 * */
	public static Date addYears(Date date, int amount)
	{
		return add(date, Calendar.YEAR, amount);
	}
	
	/**
	 * 日期添加月
	 * @param date 源日期
	 * @param amount 添加月份的大小
	 * @return Date 对象
	 * */
	public static Date addMonths(Date date, int amount)
	{
		return add(date, Calendar.MONTH, amount);
	}
	
	
	/**
	 * 日期添加周(一周为7天)
	 * @param date 源日期
	 * @param amount 添加周的大小
	 * @return Date 对象
	 * */
	public static Date addWeeks(Date date, int amount)
	{
		return add(date, Calendar.WEEK_OF_YEAR, amount);
	}
	
	
	/**
	 * 日期添加天
	 * @param date 源日期
	 * @param amount 添加天的大小
	 * @return Date 对象
	 * */
	public static Date addDays(Date date, int amount)
	{
		return add(date, Calendar.DATE, amount);
	}

	/**
	 * 日期添加小时
	 * @param date 源日期
	 * @param amount 添加小时的大小
	 * @return Date 对象
	 * */
	public static Date addHours(Date date, int amount)
	{
		return add(date, Calendar.HOUR_OF_DAY, amount);
	}
	
	/**
	 * 日期添加分钟
	 * @param date 源日期
	 * @param amount 添加分钟的大小
	 * @return Date 对象
	 * */
	public static Date addMinutes(Date date, int amount)
	{
		return add(date, Calendar.MINUTE, amount);
	}

	/**
	 * 日期添加秒
	 * @param date 源日期
	 * @param amount 添加秒的大小
	 * @return Date 对象
	 * */
	public static Date addSeconds(Date date, int amount)
	{
		return add(date, Calendar.SECOND, amount);
	}
	
	/**
	 * 日期添加毫秒
	 * @param date 源日期
	 * @param amount 添加毫秒的大小
	 * @return Date 对象
	 * */
	public static Date addMilliseconds(Date date, int amount)
	{
		return add(date, Calendar.MILLISECOND, amount);
	}

	
	/**
	 * 用户日期 向前移动的通用方式 如添加年 
	 * @param Calendar.YEAR 也可以是 1
	 * @param amount 大小
	 * @return 日期
	 * */
	private static Date add(Date date, int calendarField, int amount)
	{
		if (date == null)
		{
			throw new IllegalArgumentException("日期对象为null!");
		} else
		{
			Calendar c = Calendar.getInstance();
			
			c.setTime(date);
			c.add(calendarField, amount);
			return c.getTime();
		}
	}
	
	/**
	 * @param date 日期对象
	 * @param days 天数
	 * @param hours 小时
	 * @return 日期对象
	 * */
	public static Date getDateAfterNatureDays(Date date, int days, int hours)
	{
		if (date == null)
			date = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(5, days);
		c.add(10, hours);
		return c.getTime();
	}
	
	
	/**
	 * @param date 日期对象
	 * @param days 天数
	 * @param hours 小时
	 * @return 日期对象
	 * */
	public static Date getDateAfterWorkDays(Date date, int days, int hours)
	{
		if (date == null)
			date = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(5, days);
		c.add(10, hours);
		return c.getTime();
	}
	
	/**
	  * 获取当前月里边的第一天
	  * 
	  * @return 第一天
	  */
	 public static String getFristDayOfMonth(){
	  String day="";
	  SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
	  Calendar calendar=Calendar.getInstance();
	  calendar.set(Calendar.DAY_OF_MONTH, calendar   
	            .getActualMinimum(Calendar.DAY_OF_MONTH));   
	  day=format.format(calendar.getTime());
	  return day;
	 }
	 /**
	  * 获取当前月里边的最后一天
	  * 
	  * @return 最后一天
	  */
	 public static String getLastDayOfMonth(){
	  String day="";
	  SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
	  Calendar calendar=Calendar.getInstance();
	  calendar.set(Calendar.DAY_OF_MONTH, calendar   
	            .getActualMaximum(Calendar.DAY_OF_MONTH));   
	
	  day=format.format(calendar.getTime());
	  return day;
	 }
	
	 /**
	  * 今天星期几
	  * 
	  * @return 星期几
	  */
	 public static String getWeekDayString()
	    {
	        String weekString = "";
	        final String dayNames[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
	        Calendar calendar = Calendar.getInstance();
	        Date date = new Date();
	        calendar.setTime(date);
	        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
	        weekString = dayNames[dayOfWeek - 1];
	        return weekString;
	    }
	 
	 /**
	  * 获取月里边的第一天
	  * @param monthOffset 月份偏移量
	  * @return 第一天
	  */
	 public static String getFristDayOfMonth(int monthOffset){
	  String day="";
	  SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
	  Calendar calendar=Calendar.getInstance();
	  calendar.set(Calendar.DAY_OF_MONTH, calendar   
	            .getActualMinimum(Calendar.DAY_OF_MONTH));
	  calendar.add(Calendar.MONTH, monthOffset);
	  day=format.format(calendar.getTime());
	  return day;
	 }	 

	

}
